-- 列出 lua 语言中的基础知识点
-- 1. 注释
-- 2. 变量
-- 3. 常量
-- 4. 数据类型
-- 5. 运算符
-- 6. 控制结构
-- 7. 函数
-- 8. 表
-- 9. 字符串
-- 10. 文件操作
-- 11. 正则表达式
-- 12. 面向对象编程
-- 13. 异常处理
-- 14. 线程
-- 15. 协程
-- 16. 元编程
-- 17. 其他

-- 1. 注释
-- 单行注释以双斜线开始，直到行尾
-- 多行注释以--[[开始，直到]]结束

-- 2. 变量
-- 变量名以字母或下划线开头，后面可以跟数字、字母或下划线
-- 变量名区分大小写
-- 变量类型：nil、boolean、number、string、function、userdata、thread、table
--[[
  举几个使用变量的例子
]]
  flag = true
  print(flag) -- true
  -- print 的常见用法
  -- a. 输出变量的值
  print()
  -- b. 计算表达式的值
  -- c. 调用函数

  --[[ 
  字符串的格式化输出：string.format 
  %s: 字符串
  %d: 整数
  %f: 浮点数
  %x: 十六进制整数
  %X: 十六进制整数（大写）
  %c: 单个字符
  %o: 八进制整数
  %u: Unicode 编码整数
  %p: 指针地址
  %b: 二进制整数（无前缀）
  ]]
  print(string.format("Hello, %s!", "world"))
  print(string.format("The value of PI is %.2f", 3.141592653589793))
  print(string.format("hex: %x, oct: %o, dec: %d, char: %c", 255, 255, 255, 98))

  --[[
  assignment
  ]]
  x, y = 3, 2
  print(string.format("x = %d, y = %d", x, y))

  -- 交换 x, y 的值
  x, y = y, x
  print(string.format("x = %d, y = %d", x, y))


-- 3. 常量
-- 常量名全部大写，用下划线分隔单词
-- 常量值不能修改

--[[
  举几个使用常量的例子
]]
  PI = 3.141592653589793
  MAX_COUNT = 1000000
  MY_NAME = "Dong"

-- 4. 数据类型
-- nil：表示无值，可以赋值给变量、函数返回值、函数参数
-- boolean：true、false
-- number：整数、浮点数
-- string：字符串
-- function：函数
-- userdata：用户数据
-- thread：线程
-- table：表

--[[
  举几个数据类型的例子
]]
  a = nil
  b = true
  c = 123
  c1 = 123.456
  d = "hello, world"
  e = function() print("hello, world") end
  f = {}
  g = io.open("filename", "r")
  h = coroutine.create(function() print("hello, world") end)
  i = string.find("hello,  world", "world")
  print(i)
  print(h)

-- 5. 运算符
-- 算术运算符：+、-、*、/、%、^
-- 关系运算符：==、~=、<、<=、>、>=
-- 逻辑运算符：and、or、not
-- 赋值运算符：=、+=、-=、*=、/=、%=、^=
-- 连接运算符：..
-- 取长度运算符：#

--[[
  举几个运算符的例子
]]
  print(1 + 2)
  print(10 - 5)
  print(2 * 3)
  print(10 / 3)
  print(10.0 / 3.0)
  print(10 % 3)
  print(2 ^ 3)
  print(1 == 1)
  print(1 ~= 2)
  print(1 < 2)

-- 6. 控制结构
-- if-else：if 条件 then 语句块1 else 语句块2 end
-- for 循环：for 变量 = 初始值，终止值，步长 do 语句块 end
-- while 循环：while 条件 do 语句块 end
-- repeat-until 循环：repeat 语句块 until 条件
-- function 定义：function 函数名(参数列表) 语句块 end
-- 表构造：{key1=value1, key2=value2, ...}
-- 表访问：table[key]
-- 表更新：table[key] = value
-- 字符串连接：string1 ..  string2

-- 7. 函数
-- 函数定义：function 函数名(参数列表) 语句块 end
-- 函数调用：函数名(参数列表)
-- 传递参数：按值传递、按引用传递
-- 可变参数：...
-- 匿名函数：function(参数列表) 语句块 end

-- 8. 表
-- 表是一种无序的、动态的、关联数组
-- 表的索引可以是数字、字符串、表
-- 表的构造：{key1=value1, key2=value2, ...}
-- 表的访问：table[key]
-- 表的更新：table[key] = value
-- 表的长度：#table
-- 遍历表：for key, value in pairs(table) do 语句块 end

-- 9. 字符串
-- 字符串是一系列字符的集合
-- 字符串的构造：'string' 或 "string"
-- 字符串的访问：string[index]
-- 字符串的更新：string[index] = char
-- 字符串的长度：#string
-- 字符串的连接：string1 ..  string2

-- 10. 文件操作
-- 文件操作可以对文件进行读、写、追加、删除等操作
-- 文件读操作：file = io.open("filename", "mode")
-- 文件写操作：file:write(string)
-- 文件追加操作：file:seek("set", #file)
-- 文件关闭操作：file:close()

-- 11. 正则表达式
-- 正则表达式是一种用来匹配字符串的模式
-- 正则表达式的构造：pattern = "string"
-- 正则表达式的匹配：string.find(pattern, string)
-- 正则表达式的替换：string.gsub(pattern, replace, string)

-- 12. 面向对象编程
-- 面向对象编程是一种编程范式，它将对象作为程序的基本单元，通过封装、继承、多态等特性来实现代码的重用、灵活性和可扩展性
-- 类定义：class 类名 <父类名1, 父类名2, ...>
-- 类成员：成员变量、成员函数
-- 实例化：obj = 类名()
-- 成员访问：obj.成员名
-- 成员函数调用：obj:成员函数名(参数列表)

-- 13. 异常处理
-- 异常处理是一种错误处理机制，它可以帮助我们捕获并处理运行时出现的错误
-- 异常处理的构造：try-catch-finally
-- 异常处理的捕获：error("error message")

-- 14. 线程
-- 线程是操作系统提供的一种多任务处理方式
-- 线程的创建：thread = coroutine.create(function() 语句块 end)
-- 线程的启动：coroutine.resume(thread)
-- 线程的暂停：coroutine.yield()

-- 15. 协程
-- 协程是一种用户态的轻量级线程，它是一种纯用户态的线程，由用户自己控制调度
-- 协程的创建：co = coroutine.create(function() 语句块 end)
-- 协程的启动：coroutine.resume(co)
-- 协程的暂停：coroutine.yield()

-- 16. 元编程
-- 元编程是指在运行时对程序进行修改的能力
-- 元编程的实现：loadstring(string)
-- 元编程的例子：动态编译、代码热更新、代码生成

-- 17. 其他
-- 调试：debug.debug()
-- 断言：assert(condition, message)
-- 错误输出：io.stderr:write("error message")
-- 输入输出重定向：io.input("filename")
-- 输出重定向：io.output("filename")
-- 环境变量：os.getenv("ENV_VAR")
